package com.cskaoyan.javase.oop2._1extend._1basic;

/**
 * @description: 继承中两个类的从属关系
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 在java继承中,子类和父类具有"is-a"的关系,也就是说"子类可以看成是一个父类",子类"is-a"父类
 * 为什么?多角度分析:
 *      1,代码角度: 在正常情况下,创建子类对象应该用子类引用接收,但是实际上也可以用父类引用接收
 *          这叫做"父类引用指向子类对象",这就可以证明子类是可以看成父类,子类可以当做一个父类使用
 *      2,定义角度:
 *          数据类型的定义: 一组数据 + 基于数据的合法操作
 *          引用数据类型的定义: 成员变量 + 成员方法
 *          继承后,子类得到了父类的所有成员,那么从定义上来说,子类就可以看成一个父类,可以实现父类的功能
 *      3,直观角度:
 *          用眼睛看
 *          比如学生肯定是Person,Teacher也是
 *          直观角度不一定准确,也不一定会特别好用
 *          在开发中往往需要对业务具有一定的了解,才能够看出来父子关系
 *
 * 子类可以看成父类,那么反过来呢?父类和子类有什么关系呢?
 * 在多数情况下,子类都比父类功能强大,所以父类不能当成子类,父类和子类没有直接关系
 *
 * 扩展知识点: 引用数据类型的类型转换
 * 1,什么情况下,引用数据类型可以发生类型转换?
 *   只有两个存在父子关系的两个类型之间,才能发生类型转换(必须要有继承)
 *
 * 2,引用数据类型的类型转换,转换的是什么东西?
 *   转换的是引用的数据类型,对象的类型是不可能被转换的
 *
 * 3,引用数据类型的类型转换,分类?
 *    a,自动类型转换
 *    b,强制类型转换
 *
 * 4,引用数据类型的自动类型转换: 不需要程序员写额外代码完成类型转换,而是由编译器自动转换称之为自动类型转换
 *      条件: 把子类类型的引用转换成父类类型的引用,不需要程序员写额外代码,是自动类型转换
 *      根据在继承中从下到上的变化方向,我们把引用数据类型的自动类型转换称之为"向上转型"
 *
 * 5,引用数据类型的强制类型转换: 需要程序员写额外代码完成类型转换,编译器不会自动转换,称之为强制类型转换
 *      条件: 把父类类型的引用转换成子类类型的引用,需要写额外代码,是强制类型转换
 *          语法: (子类类型)父类类型
 *       根据在继承中从上到下的变化方向,我们把引用数据类型的强制类型转换称之为"向下转型
 *
 */
public class Demo {
    public static void main(String[] args) {
       /* Son s = new Son();
        //父类引用指向子类对象
        Father fs = new Son();*/

       /*Son s = new Son();
       Father fs;
       fs = s;*/

        /*Father f = new Father();
        Son s = ((Son) f);*/


    }
}

class Father{

}
class Son extends Father{

}